// Based on AngularJS 1.4.2

var SampleChatApp = angular.module('SampleChatApp', ['ngRoute']);

// 所有UI页的配置，每个都有UI布局页面 html文件 和对应的控制器代码
SampleChatApp.config(['$routeProvider',
  	function($routeProvider) {
    		$routeProvider.
      		when('/LoginView', {
    			templateUrl: 'LoginView.html',
    			controller: 'LoginViewController'
  		}).
      		when('/RegisterView', {
    			templateUrl: 'RegisterView.html',
    			controller: 'RegisterViewController'
      		}).
      		when('/MainView', {
    			templateUrl: 'MainView.html',
    			controller: 'MainViewController'
      		}).
      		otherwise({
    			redirectTo: '/LoginView'
      		});
}]);

// save a handle to the $rootScope obj
var rootScope;

SampleChatApp.run(['$rootScope', function ($rootScope) {
	rootScope = $rootScope;
}]);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 跳转到某个控制器，一个UI页就是一个控制器
function goto_view(v) {
  	var baseUrl = window.location.href;
	baseUrl = (baseUrl.indexOf('#') > 0 ? baseUrl.substr(0, baseUrl.indexOf('#')) : baseUrl);
	window.location.href = baseUrl + "#/" + v;
}

// 全局SDK用的变量
var apiconn = new APIConnection();

// client_info 可选，每次请求，会自动带上，发送给服务端
apiconn.client_info.clienttype = "web";

// 定义这样一个监听器，用来处理SDK 来的说与服务端连接状态改变了的通知
apiconn.state_changed_handler = function() {

	console.log("state: "+apiconn.from_state+" => "+apiconn.conn_state);

	// 这时候成功进入登录状态了。没登录时候只是访客状态。
	if (apiconn.conn_state == "IN_SESSION") {

		sessionStorage.setItem("login_name", apiconn.login_name);
		sessionStorage.setItem("login_passwd", apiconn.login_passwd);

		goto_view("MainView");
	
	// 连接状态，表明SDK和服务端已经成功连上，获得了 server_info
	// 客户端可以允许用户输入密码（或从客户端保存密码）进行登录了
	} else if (apiconn.conn_state == "LOGIN_SCREEN_ENABLED") {

		// auto re login after page refresh
		// 处理网页刷新自动登录的机制
		if (apiconn.login_name == "" && apiconn.credential_data == null) {

			var login_name = sessionStorage.getItem("login_name");
                        var login_passwd = sessionStorage.getItem("login_passwd");
		
			var cred = sessionStorage.getItem("credential_data");
			var cred_obj = null;
			if (cred !== "") cred_obj = JSON.parse(cred);

			if (login_name != "" && login_name != null) {
				apiconn.credential(login_name, login_passwd);
                        	apiconn.connect();

			} else if (cred_obj != null) {
				apiconn.credentialx(cred_obj);
                	        apiconn.connect();
			}
		}
	}
};

// SDK 说服务端有数据过来了，这可以是请求的响应，或推送
apiconn.response_received_handler = function(jo) {
	rootScope.$apply(function() {

		// 通过这个机制，分发到所有控制器，感兴趣的控制器可以这样监听
		// $scope.$on("RESPONSE_RECEIVED_HANDLER", function(event, jo) {}

		rootScope.$broadcast("RESPONSE_RECEIVED_HANDLER", jo);
	});
};

apiconn.wsUri = "ws://121.199.0.53:51717/demo";
apiconn.connect();

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 控制器代码定义，是页面逻辑部分，每个页面都有这样控制器

SampleChatApp.controller('LoginViewController', function($scope) {
  
  $scope.login_name = "test"+Math.floor(100000*Math.random());
  $scope.login_passwd = "1";
   
  $scope.login = function(event) {
  	
	apiconn.credential($scope.login_name, $scope.login_passwd);
	
	/*
  	apiconn.credentialx({
		"ctype":"normal",
		"login_name":$scope.login_name, 
		"login_passwd":$scope.login_passwd});
	*/	
  	apiconn.connect();
  };
  
  $scope.register_goto = function(event) {
  	goto_view("RegisterView");
  };

  $scope.click = function(event) {
        apiconn.send_obj({
                "obj": "business",
                "act": "click"
        });
  };

  $scope.$on("RESPONSE_RECEIVED_HANDLER", function(event, jo) {
        if (jo.obj == "business" && jo.act == "click") {
                alert("server response: clicked");
        }
  });

});

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 控制器代码定义，是页面逻辑部分，每个页面都有这样控制器

SampleChatApp.controller('RegisterViewController', function($scope) {
  
  $scope.login_goto = function(event) {
  	goto_view("LoginView");
  };
  
  $scope.register = function(event) {
	// 根据服务端 person:register 接口说明这几个字段填好
	// 服务端接口设计时一般会有这两个字段，也有可能会把登录时用的
	// 放在一个 credential_data 的字段
	// 服务端的注册接口可能还有其他要求填的字段

	// 赋予这个字段，SDK就会帮忙注册，并保活重连
  	apiconn.registration = {
		"io": "i",
		"obj": "person",
		"act": "register",
		"login_name": $scope.login_name,
		"login_passwd": $scope.login_passwd,
		"display_name": $scope.login_name
	};
	apiconn.connect();
  };
});

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 控制器代码定义，是页面逻辑部分，每个页面都有这样控制器

SampleChatApp.controller('MainViewController', function($scope) {
    
  $scope.send = function(event) {
	// 典型的请求都有这两个字段，
	// 聊天接口还有这个参数
  	apiconn.send_obj({
		"obj": "chat",
		"act": "send",
		"msg": $scope.msg
	});

	// 典型的接口请求，构造一个请求包 调用 send 就可以了
	// 就是这个send可能会被SDK拒绝。接收后，如果服务端超时，
	// 会在15秒内给出响应： uerr: ERR_CONNECTION_EXCEPTION

  };
  
  $scope.logout = function(event) {

        sessionStorage.setItem("login_name", "");
        sessionStorage.setItem("login_passwd", "");
        sessionStorage.setItem("credential_data", "");

	// 注销只需要把密码收回SDK就自动和服务端登出了，不会重连的
        apiconn.credential("", "");
        apiconn.connect();
  };
  
/*
{
    io: "o", 
    obj: "push", 
    act: "group_members", 
    durable_at: 0, 
    members: "[join: test96694] ONLINE: test38544; test78; test; test96694"
}

{
    io: "o", 
    obj: "chat", 
    act: "sent", 
    durable_at: 0, 
    from_name: "test96694", 
    from_pid: "o14341157272497889995", 
    msg: "ab cd"
}
*/
  
  $scope.messages = [];
  
  $scope.$on("RESPONSE_RECEIVED_HANDLER", function(event, jo) {

	// 约定是响应的JSON里面如果有 uerr 错误码字段，说明用户
	// 要处理。 ustr 是文本字符串的错误说明
	// 另外是 derr 是说明程序错误，不是用户导致的。用户不用作处理。

	// 是服务端给的消息成员上线，离线的消息	
	if (jo.obj == "push" && jo.act == "group_members") {
		var message = {
			"msg": jo.members,
			"from_name": "SYSTEM",
			"from_pid": "0",
			"et": Date()
		};
		
		$scope.messages.push(message);
	}

	// 是聊天返回的消息，或群聊别人调用接口，服务端给我推送的消息
	if (jo.obj == "chat" && jo.act == "sent") {
		var message = {
			"msg": jo.msg,
			"from_name": jo.from_name,
			"from_pid": jo.from_pid,
			"et": Date()
		};
		
		$scope.messages.push(message);
	}

	// 注销返回，可以回到登录界面了
	if (jo.obj == "person" && jo.act == "logout") {
		goto_view("LoginView");
	}
  });
  
});